const Token = require('./token')
const TOKEN_EXPIRE_SENCOND = 3600 * 24 * 7;
const UserModel = require('../model/user')
const Sequelize = require('sequelize')
const Common = require('../util/common')
const md5 = require('md5');
const Constant = require('../constant/constant')
const password_salt = 'ntihcbRbx1mnFKKW38ZI7hoBMKbe35Me';
const moment = require('moment');
const AdminModel = require('../model/admin');



let exportObj = {
    login,
    register,
    adminLogin
};
// 导出对象，供其它模块调用
module.exports = exportObj;

//用户登录
function login(req, res) {
    // 定义一个返回对象
    const resObj = Common.clone(Constant.DEFAULT_SUCCESS);
    // 定义一个async任务
    let tasks = {
        // 校验参数方法
        checkParams: (cb) => {
            // 调用公共方法中的校验参数方法，成功继续后面操作，失败则传递错误信息到async最终方法
            Common.checkParams(req.body, ['username', 'password'], cb);
        },
        // 添加方法，依赖校验参数方法
        add: ['checkParams', (results, cb) => {
            req.body.password = md5(md5(req.body.password) + password_salt)
            UserModel.findOne({
                where: {
                    username: req.body.username,
                    password: req.body.password
                }
            }).then(function (result) {
                if (result) {
                    resObj.data = {
                        id: result.id,
                        username: result.username,
                        name: result.name,
                        phone: result.phone,
                        avatar: result.avatar,
                        sex: result.sex,
                        controduction: result.controduction,
                        frozen: result.frozen
                    };
                    // 将admin的id保存在Token中
                    const adminInfo = {
                        id: result.id,
                        username: result.username,
                        name: result.name
                    };
                    // 生成Token
                    let token = Token.encrypt(adminInfo, TOKEN_EXPIRE_SENCOND);
                    // 将Token保存在返回对象中，返回前端
                    resObj.data.token = token;
                    // 继续后续操作，传递admin的id参数
                    cb(null);
                } else {
                    // 没有查询到结果，传递错误信息到async最终方法
                    cb(Constant.LOGIN_ERROR);
                }
            }).catch(function (err) {
                cb(Constant.DEFAULT_ERROR);
            })
        }]
    }
    //Common.autoFn(tasks, res. resObj)
    Common.autoFn(tasks, res, resObj);

}
//用户注册
function register(req, res) {
    // 定义一个返回对象
    const resObj = Common.clone(Constant.DEFAULT_SUCCESS);
    // 定义一个async任务
    let tasks = {
        // 校验参数方法
        checkParams: (cb) => {
            // 调用公共方法中的校验参数方法，成功继续后面操作，失败则传递错误信息到async最终方法
            Common.checkParams(req.body, ['username', 'password', 'name'], cb);
        },
        // 添加方法，依赖校验参数方法
        add: ['checkParams', (results, cb) => {
            req.body.password = md5(md5(req.body.password) + password_salt)

            UserModel.findAll({
                where: {
                    username: req.body.username
                }
            }).then(function (result) {
                if (result.length == 0) {
                    UserModel.create({
                        username: req.body.username,
                        password: req.body.password,
                        name: req.body.name,
                        avatar:'https://dingshiyuan123.cn/web/api/uploads/defaultavatar-1640233066587.png',
                        created_at: moment(Date.now()).format('YYYY-MM-DD HH:mm:ss'),
                        updated_at: moment(Date.now()).format('YYYY-MM-DD HH:mm:ss')
                    })
                        .then(function (result) {
                            // 插入结果处理
                            // 继续后续操作
                            cb(null);
                        })
                        .catch(function (err) {
                            // 错误处理
                            // 打印错误日志
                            console.log(err);
                            // 传递错误信息到async最终方法
                            cb(Constant.DEFAULT_ERROR);
                        });
                } else {
                    cb(Constant.REPEATED_ERRO)
                }

            }).catch(function (err) {
                cb(Constant.DEFAULT_ERROR);
            })
        }]
    }
    //Common.autoFn(tasks, res. resObj)
    Common.autoFn(tasks, res, resObj);
}

//管理员登录
async function adminLogin(req, res) {
    if (Common.check(req.body, ['username', 'password']) === false) {
        res.json(Constant.LACK)
    } else {
        try {
            // 定义一个返回对象
            const resObj = Common.clone(Constant.DEFAULT_SUCCESS);
            req.body.password = md5(md5(req.body.password) + password_salt)
            let result = await AdminModel.findOne({
                where: {
                    username: req.body.username,
                    password: req.body.password
                },
            })
            if (result) {
                resObj.data = {
                    id: result.id,
                    username: result.username,
                    name: result.name,
                };
                // 将admin的id保存在Token中
                const adminInfo = {
                    id: result.id,
                    username: result.username,
                    name: result.name,
                    admin:1
                };
                // 生成Token
                let token = Token.encrypt(adminInfo, TOKEN_EXPIRE_SENCOND);
                // 将Token保存在返回对象中，返回前端
                resObj.data.token = token;
                res.json(resObj)
            } else {
                // 没有查询到结果，传递错误信息到async最终方法
                res.json(Constant.LOGIN_ERROR);
            }

        } catch (error) {
            console.log(error);
            res.json(Constant.DEFAULT_ERROR)
        }

    }
}




